#include <iostream>
#include <string>
#include <stack>
#include <unordered_map>

using namespace std;

stack<int> num; // 操作数栈
stack<char> op; // 运算符栈
unordered_map<char,int> h{ {'+', 1}, {'-', 1}, {'*', 2}, {'/', 2} }; // 优先级表

void eval() { // 计算表达式的值 
	int a = num.top(); // 第一个操作数
	num.pop();
	
	int b = num.top(); // 第二个操作数 
	num.pop();
	
	int c = op.top(); // 运算符
	op.pop();
	
	int r = 0; // 结果
	// 计算结果 
	if (c == '+') r = b + a;
	if (c == '-') r = b - a;
	if (c == '*') r = b * a;
	if (c == '/') r = b / a;
	
	num.push(r); // 将计算结果入栈 
}

int main() {
	string s; // 表达式
	cin >> s;
	
	for (int i = 0; i < s.size(); i ++ ) {
		// 将数字转换并入栈 
		if (isdigit(s[i])) { 
			int x = 0, j = i;
			while (isdigit(s[j]) && j < s.size()) { // 转换数字 
				x = x * 10 + s[j] - '0';
				j ++ ;
			}
			num.push(x); // 将转换后的数字入栈 
			i = j - 1; // 将下标退后一位，使其 +1 后正好指向下一个未判断过的字符 
		}
		// 左括号可直接入栈 
		else if (s[i] == '(') op.push(s[i]);
		// 遇到右括号时，则要将整个括号中的表达式求值入栈 
		else if (s[i] == ')') {
			// 一直计算到左括号 
			while (op.top() != '(') eval();
			op.pop(); // 最后将左括号出栈 
		}
		else {
			// 若此前已有运算符且待入栈运算符优先级更低或一样，则先计算之前的表达式的值并入栈 
			while (op.size() && h[op.top()] >= h[s[i]]) eval();
			op.push(s[i]); // 将操作符入栈 
		}
	}
	
	while (op.size()) eval(); // 若还存在操作符则继续计算表达式的值、
	
	cout << num.top() << endl; // 输出最终表达式的计算结果，即为操作数的栈顶元素(最后一个数) 
	
	return 0; // 结束快乐 
}